package cn.com.homeyoda.aimate.aihealth.utils;

import org.json.JSONException;
import org.json.JSONObject;

public class HealthDataProcessor {

    public enum DataType {
        BLOOD_PRESSURE,  // 血压
        BLOOD_SUGAR,     // 血糖
        BLOOD_KETONE,    // 血酮
        URIC_ACID,       // 尿酸
        UNKNOWN
    }

    public enum ResultType {
        SUCCESS,         // 成功数据
        ERROR,           // 失败数据
        IGNORED,         // 无用数据
        UNKNOWN
    }

    public static class ProcessResult {
        public DataType dataType;
        public ResultType resultType;
        public JSONObject data;

        public ProcessResult(DataType dataType, ResultType resultType, JSONObject data) {
            this.dataType = dataType;
            this.resultType = resultType;
            this.data = data;
        }
    }

    /**
     * 处理健康数据
     */
    public static ProcessResult processHealthData(String jsonString) {
        try {
            JSONObject jsonData = new JSONObject(jsonString);

            // 1. 先判断数据类型
            DataType dataType = determineDataType(jsonData);

            // 2. 再判断结果类型
            ResultType resultType = determineResultType(jsonData, dataType);

            return new ProcessResult(dataType, resultType, jsonData);

        } catch (JSONException e) {
            e.printStackTrace();
            return new ProcessResult(DataType.UNKNOWN, ResultType.ERROR, null);
        }
    }

    /**
     * 判断数据类型
     */
    private static DataType determineDataType(JSONObject data) {
        String check = data.optString("check", "");
        String stripName = data.optString("stripName", "");

        if ("血压".equals(check)) {
            return DataType.BLOOD_PRESSURE;
        } else if ("三合一".equals(check)) {
            switch (stripName) {
                case "血糖":
                    return DataType.BLOOD_SUGAR;
                case "血酮":
                    return DataType.BLOOD_KETONE;
                case "尿酸":
                    return DataType.URIC_ACID;
                default:
                    return DataType.UNKNOWN;
            }
        }
        return DataType.UNKNOWN;
    }

    /**
     * 判断结果类型
     */
    private static ResultType determineResultType(JSONObject data, DataType dataType) {
        switch (dataType) {
            case BLOOD_PRESSURE:
                return determineBloodPressureResult(data);
            case BLOOD_SUGAR:
            case BLOOD_KETONE:
            case URIC_ACID:
                return determineTripleResult(data);
            default:
                return ResultType.UNKNOWN;
        }
    }

    /**
     * 判断血压数据结果类型
     */
    private static ResultType determineBloodPressureResult(JSONObject data) {
        // 成功数据：包含systolic和diastolic
        if (data.has("systolic") && data.has("diastolic")) {
            return ResultType.SUCCESS;
        }
        // 失败数据：包含code和desc
        if (data.has("code") && data.has("desc")) {
            return ResultType.ERROR;
        }
        // 无用数据：只有press字段
        if (data.has("press") && !data.has("systolic")) {
            return ResultType.IGNORED;
        }
        return ResultType.UNKNOWN;
    }

    /**
     * 判断三合一数据结果类型（血糖、血酮、尿酸）
     */
    private static ResultType determineTripleResult(JSONObject data) {
        // 成功数据：包含value和temp，且没有错误码或错误码为正常值
        if (data.has("value") && data.has("temp")) {
            String code = data.optString("code", "");
            // 如果code为空或者是正常的工作code，认为是成功
            if (code.isEmpty() || "20".equals(code) || "161".equals(code) || "623".equals(code)) {
                return ResultType.SUCCESS;
            }
            return ResultType.ERROR;
        }
        // 失败数据：包含code且没有value和temp
        if (data.has("code") && !data.has("value")) {
            return ResultType.ERROR;
        }
        // 无用数据：只有基础信息没有测量值
        if (data.has("strip") && !data.has("value")) {
            return ResultType.IGNORED;
        }
        // 中间数据：有value但没有temp
        if (data.has("value") && !data.has("temp")) {
            return ResultType.IGNORED;
        }
        return ResultType.UNKNOWN;
    }
}
